ftell関数は、ファイルの現在の入力・出力位置(ファイルオフセット)を取得することができます。
#include <stdio.h>
long ftell(FILE *stream);
*streamはfopen関数で取得した、ファイルポインタを指定します。
戻り値として、正常に処理ができた場合は現在のオフセットを、失敗した場合は-1を返します。
次の例題プログラムは、入力したデータの英小文字を英大文字に変換した後、同じ場所にデータを出力することにより、ファイル内の英字を大文字にしています。ファイルの更新を行うため、fopen関数のオープンモードは’r+’になっています。
プログラム 例
#include <stdio.h> #include <string.h> #include <ctype.h> #define SIZE 1024 int main(int argc, char **argv) { FILE *fp; long offset; char buff[SIZE]; char *p_buff; int return_code = 0; if (argc == 2) { if ((fp = fopen(*(argv + 1), 'r+')) != NULL) { while(fgets(buff, SIZE, fp) != NULL) { /* 英小文字を英大文字に変換 */ for (p_buff = buff; *p_buff; ++p_buff) { *p_buff = toupper(*p_buff); } /* 入力したデータの先頭のファイルオフセットを求める */ offset = ftell(fp) - strlen(buff); /* 入力したデータの先頭にファイルオフセットを戻す */ fseek(fp, offset, SEEK_SET); fputs(buff, fp); } fclose(fp); } else { printf('ファイルのオープンに失敗しました\n'); return_code = 1; } } else { printf('実行時引数の数が不当です\n'); return_code = 1; } return return_code; }
例の実行結果
$ cat temp_1.txt #include <stdio.h> int main() { printf('Hello World!!.\n'); return 0; } $ $ ./ftell.exe temp_1.txt $ $ cat temp_1.txt #INCLUDE <STDIO.H> INT MAIN() { PRINTF('HELLO WORLD!!.\N'); RETURN 0; } $